
#include "Bonus.h"


void initBonus(Bonus *pBon)
{
	pBon->taille = 0;
	pBon->capacite = 4;
	pBon->tab_cartriche = (Carte *) malloc (4*sizeof(Carte));
}

Bonus * creerBonus()
{
    Bonus *pBon = (Bonus *) malloc (sizeof(Bonus));
    initBonus(pBon);
    return pBon;
}

void libereBonus(Bonus *pBon)
{   
    int i;
    for(i=pBon->taille-1;i>=0;i--)
    {
        libereCarte(&pBon->tab_cartriche[i]);
    }
    free(pBon->tab_cartriche);
    pBon->tab_cartriche = NULL;
	pBon->taille=0;
}

void detruitBonus(Bonus **ppBon)
{
    libereBonus(*ppBon);
    free(*ppBon);
    *ppBon = NULL;
}

void set_triche(Bonus *pBon, const Carte * ptriche) 
{
    initCarte(&(pBon->tab_cartriche[pBon->taille]));
    copieCarte(&(pBon->tab_cartriche[pBon->taille]), ptriche);
    pBon->taille++;
}

int get_postriche(const Bonus *pBon,const char *nom)
{
    int i;
    for(i=0;i<pBon->taille;i++)
    {
        int vf = strcmp(pBon->tab_cartriche[i].nom, nom);
        if(vf == 0)
        {
            return i;
        }
    }
    return 42;
}

Carte * get_triche(const Bonus *pBon, int positiontriche)
{
    assert((positiontriche>=0));
    return &pBon->tab_cartriche[positiontriche];

}

void copieBonus(Bonus *bon1, const Bonus * bon2)
{
    int i;
    for(i=0;i<4;i++)
    {
        copieCarte(&bon1->tab_cartriche[i], &bon2->tab_cartriche[i]);
    }
    bon1->taille = bon2->taille;
}

void supp_triche(Bonus *pBon,const int i) 
{
    int j;
    assert((i>=0)&&(i<pBon->taille));
    if(i<pBon->taille-1)
    {
      for(j=i;j<pBon->taille-1;j++)
      {
          copieCarte(&pBon->tab_cartriche[i],&pBon->tab_cartriche[i+1]);
      }
    }
    libereCarte(&pBon->tab_cartriche[pBon->taille-1]);
    pBon->taille--;

}

void remplirTabBonus(Bonus * bo, const char * adr)
{
	int nbrL, nbrC, numlign, i, j;
	FILE * fic = NULL;
	Carte * C;
	char * ligne;

	suppLigneVide(adr);
	fic = fichierInit(adr);

	nbrL = nbrLigneFichier(fic);
	nbrC = nbrL/4;

	bo->taille = 0;
	bo->capacite = nbrC;
	free(bo->tab_cartriche);
    	bo->tab_cartriche = (Carte *) malloc(nbrC*sizeof(Carte));

	/*Rempli chaque carte et l'ajoute au tableau de bonus*/
    	for(i=0;i<nbrC;i++)
    	{
        	numlign = i*4+1;
        	C = creerCarte();
		/*Rempli le genre*/
        	ligne = (char*)malloc(16 * sizeof(char));
        	lireLigne(fic, numlign, ligne);
        	j = strlen(ligne);
        	free(ligne);
        	setGenreCarte(C,j-1);
        	numlign++;
		/*Rempli le nom*/
        	ligne = (char*)malloc(32 * sizeof(char));
        	lireLigne(fic, numlign, ligne);
        	setNomCarte(C, ligne);
        	free(ligne);
        	numlign++;
		/*rempli la définition*/
        	ligne = (char*)malloc(128 * sizeof(char));
        	lireLigne(fic, numlign, ligne);
        	setDefinitionCarte(C,ligne);
        	free(ligne);
		/*Insertion dans le tableau de bonus*/
		set_triche(bo,C);
        	detruireCarte(&C);
    	}
	fclose(fic);
}

int retourneBonusQuestions(const Bonus * pBon)
{
    int i;
	int nbrB = 0;
	GenreCarte genre;
    for(i=0;i<pBon->taille;i++)
    {
        genre = getGenreCarte(&pBon->tab_cartriche[i]);
        if(genre == 6)
        {
            nbrB++;
        }
    }
    return nbrB;
}

int getNbrBonus(const Bonus * bo)
{
	return bo->taille;
}

void bonusTestRegression()
{
    int i;
    Bonus *pBon;
    Carte ptriche;
    char *nom = "carte magique";
    char *def = "une carte trop bien";

    initCarte(&ptriche);
    setGenreCarte(&ptriche, 3);
    setNomCarte(&ptriche, nom);
    setDefinitionCarte(&ptriche, def);

    pBon = creerBonus();
    printf("=Test De Regression=\n");
    assert(pBon->taille == 0);
    printf("--appel a set_triche-- \n");
    set_triche(pBon,&ptriche);
    set_triche(pBon,&ptriche);
    for(i=0;i<2;i++)
    {
        printf("bonus initialisé avec 4 carte de type 3 triche %d \n",getGenreCarte(&pBon->tab_cartriche[i]));
    }

    printf("--appel a get_postriche-- \n");
    printf("la carte qui porte le nom %s est dans la case no %d \n",nom , get_postriche (pBon,nom));

    supp_triche(pBon,0);
    for(i=0;i<1;i++)
    {
        printf("bonus initialisé avec 4 carte de type 3 triche %d \n",getGenreCarte(&pBon->tab_cartriche[i]));
    }
    set_triche(pBon,&ptriche);
    detruitBonus(&pBon);
    libereCarte(&ptriche);
    printf("=Fin Test De Regression: OK =\n");

}





